#include <Arduino.h>
#include "Suntracker.h"


Suntracker::Suntracker()
{
  ldrU = 0;
  ldrD = 0;
  ldrL = 0;
  ldrR = 0;
  
  coefUp = 1;
  coefDown = 1;
  coefLeft = 1;
  coefRight = 1;

}

void Suntracker::read(int samples, int delayBetweenSamples, boolean calibrateSensor)
{
  
  ldrU = 0;
  ldrD = 0;
  ldrL = 0;
  ldrR = 0;
  //Tomamos varias medidas de cada canal y las promediamos para evitar picos extraños
  for (int i = 0; i < samples; i++)
  {
    ldrU += analogRead(IUP);
    ldrD += analogRead(IDOWN);
    ldrL += analogRead(ILEFT);
    ldrR += analogRead(IRIGHT);
    delay(delayBetweenSamples);
  }
  ldrU = ldrU/samples;
  ldrD = ldrD/samples;
  ldrL = ldrL/samples;
  ldrR = ldrR/samples;
  
  if (calibrateSensor)
    calibrate();
    
  ldrU   *= coefUp;
  ldrD   *= coefDown;
  ldrL   *= coefLeft;
  ldrR   *= coefRight;

}


void Suntracker::calibrate()
{
    //Modificamos los coeficientes
    //de corrección, que los uso porque a misma intensidad de luz, las
    //LDR dan mediciones ligeramente distintas.
    //Durante el calibrado, el sensor de las 4 ldr tiene que estar apuntando a 
    //una luz homogénea, sino se desvía la medición.

    Serial.println("CALIBRANDO...");
    int average = (ldrU + ldrD + ldrL + ldrR) / 4;
    
    coefUp = (float)(average) / (float)(ldrU);
    coefDown = (float)(average) / (float)(ldrD);
    coefLeft = (float)(average) / (float)(ldrL);
    coefRight = (float)(average) / (float)(ldrR);
  
    Serial.print("Coef UP:");
    Serial.print(coefUp);
    Serial.print("\tCoef DOWN:");
    Serial.print(coefDown);
    Serial.print("\tCoef LEFT:");
    Serial.print(coefLeft);
    Serial.print("\tCoef RIGHT:");
    Serial.print(coefRight);
    Serial.println();
    
    //TODO: LOS COEFICIENTES A LA EEPROM... PENSARLO BIEN
}


void Suntracker::displayValues()
{
  
  Serial.print("U: ");
  Serial.print(ldrU);
  Serial.print("\tD: ");
  Serial.print(ldrD);
  Serial.print("\tL: ");
  Serial.print(ldrL);
  Serial.print("\tR: ");
  Serial.print(ldrR);
  Serial.print("\tDelta UD: ");
  Serial.print(getUdDelta());
  Serial.print("\tDelta LR: ");
  Serial.print(getLrDelta());

  Serial.println();
 
 
}



int Suntracker::getDeltaThreshold()
{
  return 20; //TODO: leer este valor de un pot vble en placa
}
float Suntracker::getRatioThreshold()
{
  return 1.10; //TODO: leer este valor de un pot vble en placa
}
